## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v dplyr   1.0.2
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union

The Growing Esports Industry

The first competitive games started on arcade machines in the late 1970s with Space Invader and Twin Galaxies where the professional players strive to beat each other’s record to become the world record holder. In the 1980s, more games were released that many of us know today like Pac-Man. A shift from arcades to gaming consoles occurred with the release of Nintendo systems. The new popularized way of gaming was becoming more accessible to the average consumer than ever before. As Nintendo continued to grow through the 1990s, the fast advancing computer technology became a new and different mode of gaming with personal computers.

1980s competitve games

The large amount of competitive users led to organized competitions where tens of millions of fans of the top games follow these matches allowing the game companies to profit. Eventually these competitive matches transformed into a sport known as Esports. Many of the top games help create and influence the start of Esports teams and organizations made of world-class gamers. In total, hundreds of millions of US dollars are profitted from the Esports industries only in terms of prize earnings from professional tournaments.

  • (HERE OF BEFORE THE PARAGRAPH ABOVE) DISCUSS THE DATA COLLECTION PROCESS AND POSSIBLY A CLEARER INTRO TO THE TOPIC IF NOT CLEAR ENOUGH ALREADY
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` ungrouping output (override with `.groups` argument)

As seen above, in late 1990s to the late 2010s there was a exponential growth in the tournaments’ prize earnings from all Esports teams, orgnaizations, and all variety of competitive. In fact the earnings from tournaments in the last 3 years totals to more than the 20 years before! Unfortunately for the Esports industry in 2020, the toll of the COVID-19 pandemic is evident where large gatherings were impossible to view the professional matches. the canceled tournaments destryed the potential of growth of Esports although some game companies like Riot Games worked with the teams to provide a remote competitive experience to provide a fair tournament to take place (more on this later).

These Esports organizations are created with a focus on a specific game and eventually grow from tournament prizes.

The bargraph above shows the top Esports organzations/teams around the world with teams that have contracted professional players who competed in professional matches and earn the tournaments prizes. One of the games that provide one the largest percent of the organization’s total earnings is League of Legends.

Of the top four Esports teams that have earned the majority of their prize from professional tournaments from League of Legends, the three teams, SK Telecom T1, Invictus Gaming, and Fnatic, have all won the international League of Legends Worlds tournament. League of legends have impacted the massive growth of the largest Esports teams in the world.

What is League of Legends?

Map of League of Legends - Summoner’s Rift

But before we can discuss the impact of League of Legends, it is good to know what the praise and large following of the game is about. Created in 2009, League legends is a team multiplayer online battle arena where the two teams made of 5 players where the goal is to defeat the enemies’ “nexus” or their base located on opposite sides of the map. The map, called "Summoner’s Rift, is split by three lanes lined with three turrets in each lane and two more turrets protecting the nexus for each side of the map. In between each lane is an area known as the jungle where jungle monsters (raptors, krugs, wolves, gromp, golem, blue sentinel, and red brambleback)reside. There is also a river that runs across the map with pits home to the Rift Herald, Baron Nashor, and Elemental Dragons.

Each team chooses a champion that spawn on the map that have with an assigned role: top lane, mid lane, bot lane, support (also in the bot lane), and jungler. Based of the name of their roles, they will play the game in those repective locations. When the game starts, the lane players (also called laners) meet each other in their lane with a small group of minions that continously respawn and walk from the nexus down their repective lanes, while the jungler traverses through the jungle. In each lane, the laners goal is to kill the minions for earning in game gold and also attempt to kill the opposing enemy laner which also grants them a significant amount more gold. The junglers also earn in game gold by killing the jungler monsters or visiting a lane to kill the enemy. This process of killing minions, monsters, and enemy players goes on as each player accumulates gold in order to purchase specialized items to increase the strength and health of each player’s champion. The stronger the champion becomes the higher the chance the team can kill the enemies and push towards their base to destroy the nexus and win the match.

The becomes much more complicated when professional players and teams consider the smallest details, stats, and actions. A small mistake by buying the wrong in game item or walking to the wrong area and getting ambushed by the enemy can turn the game around towards the team that would seem to be losing. But what statistics will majorly determines the likelihood the team will win?

Before I can answer this question, I will explain what the data is collected on. In multiplayer League of Legends, there are two main gamemodes on Sommoner’s Rift: Normal and Ranked. The difference between the two gamemodes is Ranked gives the players a tier from Iron to Challenger where the players can climd the tier ladder by earning “LP” points. another thing to note is when a player quenes up for a game match on the Summoner’s Rift map they will spawn on the right side nexus of the left side nexus where right is blue side and left is red side.

The graph above shows the data collected from over 9,800 Diamond ranked games from the Western European server. The focus of this specific analysis for League of Legends shows that among the many variables inside the game over 70% of the games a team wins by non professional players are greatly impacted by the positive gold difference relative to the opposing team where the gold is earned by farming minions and jungle monsters, killing the enemy, and accomplishing the objectives that give gold.

Ranks from left to right: Iron, Bronze, Silver, Gold, Platinum, Diamond, Master, Grandmaster, Challenger

Other factors that lead to the result of the game that are less related (although paritally involve gold game for the players) are objectives. In the game on Summoner’s Rift there are certain objectives to help the team pull ahead to reach the final goal of destroying the nexus. The following is a general list of objectives that the team can achieve located in the pits around the river of the map: - Rift Herald: killing this creature gives the player a drop that can be spawned to act as a battering ram against turrents and other enemy structures that will grant gold to the players - Elemental Dragons: There are four elemental dragons that the players can kill that will grant the entire team a buff in creased in a certain stat based on whcih dragon is slain - Baron Nashor: A giant serpent-like creature that when killed grants the the player 300 gold on the team. Also gives them power of strengthen the ally minions when the payer is close enough to the minions. - Elder Dragon: killing the Elder dragon grants the team 250 gold and strongest individual buff to each player that lasts for a short time.

For each objective that the team achieves from the list above within a match, one objective point is given to the blue/red team. The graph above shows how completing objectives can result in a win. Matches labeled “Expected” means a team’s objective score is higher than the other team and the final result is the team with the higher score won. Matches labeled “Undefined” means the objective score for both teams are equal so the result of the match depends on other factors. Matches labeled "Unexpected means a team’s objective score is lower than the other team and the final result is the team with the lower score won. Over 60% of the matches in over 9800 Diamond ranked games show that completing objectives

So what does all this data mean for the average League of legends? In order for you to have the best chance possible to win the game, it is extremely important to farm minions and kill jungle monsters to have the safest path towards earning the most gold without dying by the enemy and winning a game.

Professional League of Legends Esports

-talk about how i only selected the top 4 regions -use the data and explain its meaning - use the high diamond ranked games data - use the pro matches to show the level and difference between diamond and pro player games

## `summarise()` regrouping output by 'league' (override with `.groups` argument)

## Warning: Problem with `mutate()` input `t1_elders`.
## i NAs introduced by coercion
## i Input `t1_elders` is `.Primitive("as.double")(t1_elders)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t2_elders`.
## i NAs introduced by coercion
## i Input `t2_elders` is `.Primitive("as.double")(t2_elders)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t1_heralds`.
## i NAs introduced by coercion
## i Input `t1_heralds` is `.Primitive("as.double")(t1_heralds)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t2_heralds`.
## i NAs introduced by coercion
## i Input `t2_heralds` is `.Primitive("as.double")(t2_heralds)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t1_firsttothreetowers`.
## i NAs introduced by coercion
## i Input `t1_firsttothreetowers` is `.Primitive("as.double")(t1_firsttothreetowers)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t2_firsttothreetowers`.
## i NAs introduced by coercion
## i Input `t2_firsttothreetowers` is `.Primitive("as.double")(t2_firsttothreetowers)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t1_inhibitors`.
## i NAs introduced by coercion
## i Input `t1_inhibitors` is `.Primitive("as.double")(t1_inhibitors)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion
## Warning: Problem with `mutate()` input `t2_inhibitors`.
## i NAs introduced by coercion
## i Input `t2_inhibitors` is `.Primitive("as.double")(t2_inhibitors)`.
## Warning in mask$eval_all_mutate(dots[[i]]): NAs introduced by coercion

Why is this game imapctful to Esports?

  • TALK ABOUT TWITCH
LS0tDQp0aXRsZTogIkVzcG9ydHM6IExlYWd1ZSBvZiBMZWdlbmRzIg0KYXV0aG9yOiAiKkNoYXJsaWUgVHJhbioiDQpkYXRlOiAiMTIvMTgvMjAyMCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAga2VlcF9tZDogVFJVRQ0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogdW5pdGVkDQogIA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoja25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBlcnJvcj1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCmBgYHtyIGxpYnJhcmllcywgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKSAgICAgIyBmb3IgZGF0YSBjbGVhbmluZyBhbmQgcGxvdHRpbmcNCmxpYnJhcnkobHVicmlkYXRlKSAgICAgIyBmb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoZ2d0aGVtZXMpICAgICAgIyBmb3IgbW9yZSB0aGVtZXMgKGluY2x1ZGluZyB0aGVtZV9tYXAoKSkNCmxpYnJhcnkoZ2dhbmltYXRlKSAgICAgIyBmb3IgYWRkaW5nIGFuaW1hdGlvbiBsYXllcnMgdG8gZ2dwbG90cw0KbGlicmFyeShnaWZza2kpICAgICAgICAjIGZvciBjcmVhdGluZyB0aGUgZ2lmIChkb24ndCBuZWVkIHRvIGxvYWQgdGhpcyBsaWJyYXJ5IGV2ZXJ5IHRpbWUsYnV0IG5lZWQgaXQgaW5zdGFsbGVkKQ0KbGlicmFyeSh0cmFuc2Zvcm1yKSAgICAjIGZvciAidHdlZW5pbmciIChnZ2FuaW1hdGUpDQpsaWJyYXJ5KHBhdGNod29yaykgICAgICMgZm9yIG5pY2VseSBjb21iaW5pbmcgZ2dwbG90MiBncmFwaHMgIA0KbGlicmFyeShndCkgICAgICAgICAgICAjIGZvciBjcmVhdGluZyBuaWNlIHRhYmxlcw0KbGlicmFyeShzdHJpbmdyKSAgICAgICAjIGZvciBzdHJpbmcgY29udmVyc2lvbnMNCmxpYnJhcnkoZ2dpbWFnZSkgICAgICAgIyBmb3IgcmVhZGluZyBpbiBpbWFnZXMNCmxpYnJhcnkocG5nKQ0KYGBgDQoNCmBgYHtyIGRhdGEsIGVjaG8gPSBGQUxTRX0NCkdlbmVyYWxFc3BvcnREYXRhIDwtIHJlYWQuY3N2KCJHZW5lcmFsRXNwb3J0RGF0YS5jc3YiKQ0KDQpIaXN0b3JpY2FsRXNwb3J0RGF0YSA8LSByZWFkLmNzdigiSGlzdG9yaWNhbEVzcG9ydERhdGEuY3N2IikgJT4lIA0KICBtdXRhdGUoRGF0ZSA9IGRteShEYXRlKSkgJT4lIA0KICBtdXRhdGUoeWVhciA9IHllYXIoRGF0ZSkpDQoNCmhpZ2hfZGlhbW9uZF9yYW5rZWRfMTBtaW4gPC0gcmVhZC5jc3YoImhpZ2hfZGlhbW9uZF9yYW5rZWRfMTBtaW4uY3N2IikNCg0KdHdpdGNoZGF0YSA8LSByZWFkLmNzdigidHdpdGNoZGF0YS5jc3YiKQ0KDQpwcm9fbG9sX21hdGNoZXMgPC0gcmVhZC5jc3YoIm1hdGNoZXMyMDIwLmNzdiIpDQoNCnRlYW1fZWFybmluZ3MgPC0gcmVhZC5jc3YoImVlLmNzdiIpDQoNCmxvbF90b3VybmFtZW50X2Vhcm5pbmdzIDwtIHJlYWQuY3N2KCJsb2xlYXJuaW5nc2J5dGVhbS5jc3YiKQ0KDQpwcm9faW5kZXB0aF9zdGF0cyA8LSByZWFkLmNzdigiMDhfMTlfMjAyMC5jc3YiKSAlPiUgDQogIGZpbHRlcihsZWFndWUgJWluJSBjKCJMUEwiLCAiTENTIiwgIkxDSyIsICJMRUMiKSkgJT4lIA0KICBzZWxlY3QoYygibGVhZ3VlIiwgInBhdGNoIiwgZW5kc193aXRoKGMoImRyYWdvbnMiLCAiZWxkZXJzIiwgImhlcmFsZHMiLCAiYmFyb25zIiwgInRvd2VycyIsICJpbmhpYml0b3JzIiwgInRvdGFsZ29sZCIsICJyZXN1bHQiKSkpKSAlPiUgDQogIGFycmFuZ2UobGVhZ3VlKSAlPiUgDQogIG11dGF0ZV9hbGwofnJlcGxhY2UoLiwgaXMubmEoLiksIDApKQ0KICANCnR3aXRjaF9nYW1lcyA8LSByZWFkLmNzdigiVHdpdGNoX2dhbWVfZGF0YS5jc3YiKQ0KYGBgDQoNCiMjIFRoZSBHcm93aW5nIEVzcG9ydHMgSW5kdXN0cnkNCiAgDQpUaGUgZmlyc3QgY29tcGV0aXRpdmUgZ2FtZXMgc3RhcnRlZCBvbiBhcmNhZGUgbWFjaGluZXMgaW4gdGhlIGxhdGUgMTk3MHMgd2l0aCBTcGFjZSBJbnZhZGVyIGFuZCBUd2luIEdhbGF4aWVzIHdoZXJlIHRoZSBwcm9mZXNzaW9uYWwgcGxheWVycyBzdHJpdmUgdG8gYmVhdCBlYWNoIG90aGVyJ3MgcmVjb3JkIHRvIGJlY29tZSB0aGUgd29ybGQgcmVjb3JkIGhvbGRlci4gSW4gdGhlIDE5ODBzLCBtb3JlIGdhbWVzIHdlcmUgcmVsZWFzZWQgdGhhdCBtYW55IG9mIHVzIGtub3cgdG9kYXkgbGlrZSBQYWMtTWFuLiBBIHNoaWZ0IGZyb20gYXJjYWRlcyB0byBnYW1pbmcgY29uc29sZXMgb2NjdXJyZWQgd2l0aCB0aGUgcmVsZWFzZSBvZiBOaW50ZW5kbyBzeXN0ZW1zLiBUaGUgbmV3IHBvcHVsYXJpemVkIHdheSBvZiBnYW1pbmcgd2FzIGJlY29taW5nIG1vcmUgYWNjZXNzaWJsZSB0byB0aGUgYXZlcmFnZSBjb25zdW1lciB0aGFuIGV2ZXIgYmVmb3JlLiBBcyBOaW50ZW5kbyBjb250aW51ZWQgdG8gZ3JvdyB0aHJvdWdoIHRoZSAxOTkwcywgdGhlIGZhc3QgYWR2YW5jaW5nIGNvbXB1dGVyIHRlY2hub2xvZ3kgYmVjYW1lIGEgbmV3IGFuZCBkaWZmZXJlbnQgbW9kZSBvZiBnYW1pbmcgd2l0aCBwZXJzb25hbCBjb21wdXRlcnMuIA0KDQohWzE5ODBzIGNvbXBldGl0dmUgZ2FtZXNdKDE5ODBzZ2FtZXNwaWN0dXJlLnBuZykNCg0KVGhlIGxhcmdlIGFtb3VudCBvZiBjb21wZXRpdGl2ZSB1c2VycyBsZWQgdG8gb3JnYW5pemVkIGNvbXBldGl0aW9ucyB3aGVyZSB0ZW5zIG9mIG1pbGxpb25zIG9mIGZhbnMgb2YgdGhlIHRvcCBnYW1lcyBmb2xsb3cgdGhlc2UgbWF0Y2hlcyBhbGxvd2luZyB0aGUgZ2FtZSBjb21wYW5pZXMgdG8gcHJvZml0LiBFdmVudHVhbGx5IHRoZXNlIGNvbXBldGl0aXZlIG1hdGNoZXMgdHJhbnNmb3JtZWQgaW50byBhIHNwb3J0IGtub3duIGFzIEVzcG9ydHMuIE1hbnkgb2YgdGhlIHRvcCBnYW1lcyBoZWxwIGNyZWF0ZSBhbmQgaW5mbHVlbmNlIHRoZSBzdGFydCBvZiBFc3BvcnRzIHRlYW1zIGFuZCBvcmdhbml6YXRpb25zIG1hZGUgb2Ygd29ybGQtY2xhc3MgZ2FtZXJzLiBJbiB0b3RhbCwgaHVuZHJlZHMgb2YgbWlsbGlvbnMgb2YgVVMgZG9sbGFycyBhcmUgcHJvZml0dGVkIGZyb20gdGhlIEVzcG9ydHMgaW5kdXN0cmllcyBvbmx5IGluIHRlcm1zIG9mIHByaXplIGVhcm5pbmdzIGZyb20gcHJvZmVzc2lvbmFsIHRvdXJuYW1lbnRzLiANCg0KLSAoSEVSRSBPRiBCRUZPUkUgVEhFIFBBUkFHUkFQSCBBQk9WRSkgRElTQ1VTUyBUSEUgREFUQSBDT0xMRUNUSU9OIFBST0NFU1MgQU5EIFBPU1NJQkxZIEEgQ0xFQVJFUiBJTlRSTyBUTyBUSEUgVE9QSUMgSUYgTk9UIENMRUFSIEVOT1VHSCBBTFJFQURZIA0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpiYXJsaW5lZ3JhcGggPC0gSGlzdG9yaWNhbEVzcG9ydERhdGEgJT4lIA0KICBncm91cF9ieSh5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1FYXJuaW5ncyA9IHN1bShFYXJuaW5ncykvMTAwMDAwMCkgDQogIA0KICANCmdyb3d0aF90aW1lIDwtIGdncGxvdChiYXJsaW5lZ3JhcGgsIGFlcyh4ID0geWVhciwNCiAgICAgICAgICAgICB5ID0gc3VtRWFybmluZ3MpKSsNCiAgZ2VvbV9jb2woY29sb3IgPSAiZGFya2JsdWUiLA0KICAgICAgICAgICBmaWxsID0gIndoaXRlIikrDQogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLA0KICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICBsYWJzKHRpdGxlID0gIkVzcG9ydHMgUHJvZmVzc2lvbmFsIE1hdGNoZXMgUHJpemUgRWFybmluZ3MiLA0KICAgICAgIHN1YnRpdGxlID0gIihNaWxsaW9ucyBvZiBVUyBEb2xsYXJzKSIsDQogICAgICAgeCA9ICIiLA0KICAgICAgIHkgPSAiIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSBFc3BvcnRzRWFybmluZ3MuY29tIikrDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwZXJzcGVjdGl2ZWJhciA8LSBIaXN0b3JpY2FsRXNwb3J0RGF0YSAlPiUgDQogIG11dGF0ZShlcmEgPSBpZmVsc2UoeWVhciA+PSAxOTk4ICYgeWVhciA8PSAyMDE3LA0KICAgICAgICAgICAgICAgICAgICAgICIxOTk4IC0gMjAxNyIsDQogICAgICAgICAgICAgICAgICAgICAgIjIwMTggLSAyMDIwIikpICU+JQ0KICBncm91cF9ieShlcmEpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfZWFybmluZ3MgPSBzdW0oRWFybmluZ3MpLzEwMDAwMDApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZXJhLA0KICAgICAgICAgICAgIHkgPSB0b3RhbF9lYXJuaW5ncywNCiAgICAgICAgICAgICBmaWxsID0gZXJhKSkrDQogIGdlb21fY29sKCkrDQogIGxhYnMoeSA9ICIiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICBjYXB0aW9uID0gIkNyZWF0ZWQgYnkgQ2hhcmxpZSBUcmFuIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpncm93dGhfdGltZSArIHBlcnNwZWN0aXZlYmFyIA0KYGBgDQoNCkFzIHNlZW4gYWJvdmUsIGluIGxhdGUgMTk5MHMgdG8gdGhlIGxhdGUgMjAxMHMgdGhlcmUgd2FzIGEgZXhwb25lbnRpYWwgZ3Jvd3RoIGluIHRoZSB0b3VybmFtZW50cycgcHJpemUgZWFybmluZ3MgZnJvbSBhbGwgRXNwb3J0cyB0ZWFtcywgb3JnbmFpemF0aW9ucywgYW5kIGFsbCB2YXJpZXR5IG9mIGNvbXBldGl0aXZlLiBJbiBmYWN0IHRoZSBlYXJuaW5ncyBmcm9tIHRvdXJuYW1lbnRzIGluIHRoZSBsYXN0IDMgeWVhcnMgdG90YWxzIHRvIG1vcmUgdGhhbiB0aGUgMjAgeWVhcnMgYmVmb3JlISBVbmZvcnR1bmF0ZWx5IGZvciB0aGUgRXNwb3J0cyBpbmR1c3RyeSBpbiAyMDIwLCB0aGUgdG9sbCBvZiB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgaXMgZXZpZGVudCB3aGVyZSBsYXJnZSBnYXRoZXJpbmdzIHdlcmUgaW1wb3NzaWJsZSB0byB2aWV3IHRoZSBwcm9mZXNzaW9uYWwgbWF0Y2hlcy4gdGhlIGNhbmNlbGVkIHRvdXJuYW1lbnRzIGRlc3RyeWVkIHRoZSBwb3RlbnRpYWwgb2YgZ3Jvd3RoIG9mIEVzcG9ydHMgYWx0aG91Z2ggc29tZSBnYW1lIGNvbXBhbmllcyBsaWtlIFJpb3QgR2FtZXMgd29ya2VkIHdpdGggdGhlIHRlYW1zIHRvIHByb3ZpZGUgYSByZW1vdGUgY29tcGV0aXRpdmUgZXhwZXJpZW5jZSB0byBwcm92aWRlIGEgZmFpciB0b3VybmFtZW50IHRvIHRha2UgcGxhY2UgKG1vcmUgb24gdGhpcyBsYXRlcikuDQoNClRoZXNlIEVzcG9ydHMgb3JnYW5pemF0aW9ucyBhcmUgY3JlYXRlZCB3aXRoIGEgZm9jdXMgb24gYSBzcGVjaWZpYyBnYW1lIGFuZCBldmVudHVhbGx5IGdyb3cgZnJvbSB0b3VybmFtZW50IHByaXplcy4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQp0b3BfdGVhbV9lYXJuaW5ncyA8LSB0ZWFtX2Vhcm5pbmdzICU+JSANCiAgYXJyYW5nZShkZXNjKFRvdGFsVVNEUHJpemUpKSAlPiUgDQogIGZpbHRlcihUb3RhbFVTRFByaXplID4gOTAwMDAwMCkNCg0KdGVhbWxpcXVpZCA8LSAiVGVhbV9MaXF1aWRsb2dvLnBuZyINCm9nIDwtICJPR19Fc3BvcnRzbG9nby5wbmciDQpldmlsZ2VuaXVzZXMgPC0gImVnbG9nby5wbmciDQpmbmF0aWMgPC0gIkZuYXRpY2xvZ29fc3F1YXJlLnBuZyINCnZpcnR1cy5wb3IgPC0gIlZpcnR1cy5wcm9sb2dvX3NxdWFyZS5wbmciDQpuZXdiZWUgPC0gIk5ld2JlZWxvZ29fc3F1YXJlLnBuZyINCnZpY2lnYW1pbmcgPC0gIjYwMHB4LVZJQ0lfR2FtaW5nLnBuZyINCnRlYW1zZWNyZXQgPC0gIlRlYW1fU2VjcmV0XyhWaWV0bmFtZXNlX1RlYW0pbG9nb19zcXVhcmUucG5nIg0KaW52aWN0dXNnYW1pbmcgPC0gInBuZy10cmFuc3BhcmVudC1kb3RhLTItYXNpYS1jaGFtcGlvbnNoaXBzLTIwMTUtdGhlLWludGVybmF0aW9uYWwtMjAxNC1pbnZpY3R1cy1nYW1pbmctZXZpbC1nZW5pdXNlcy1vdGhlcnMtZ2FtZS1idXJuaW5nLWxvZ28ucG5nIg0KbmF0dXN2aW5jZXJlIDwtICJOYVZpX2xvZ28ucG5nIg0KbGdkZ2FtaW5nIDwtICJMR0RfR2FtaW5nbG9nb19zcXVhcmUucG5nIg0KY2xvdWQ5IDwtICIxMjgwcHgtQ2xvdWQ5X2xvZ28uc3ZnLnBuZyINCnNrdCA8LSAiU0tfVGVsZWNvbV9UMWxvZ29fc3F1YXJlLnBuZyINCndpbmdzZ2FtaW5nIDwtICI2MDBweC1XaW5ncy5wbmciDQpwYXJpc3NhaW50Z2VybWFpbiA8LSAiUGFyaXNfU2FpbnQtR2VybWFpbl9lU3BvcnRzbG9nb19zcXVhcmUucG5nIg0KZmF6ZWNsYW4gPC0gIjEyMDBweC1GYXplX0NsYW4ucG5nIg0KDQp0b3BfdGVhbV9pbWFnZXMgPC0gdGliYmxlKGltYWdlID0gYyh0ZWFtbGlxdWlkLCBvZywgZXZpbGdlbml1c2VzLCBmbmF0aWMsIHZpcnR1cy5wb3IsIG5ld2JlZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY2lnYW1pbmcsIHRlYW1zZWNyZXQsIGludmljdHVzZ2FtaW5nLCBuYXR1c3ZpbmNlcmUsIGxnZGdhbWluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3VkOSwgc2t0LCB3aW5nc2dhbWluZywgcGFyaXNzYWludGdlcm1haW4sIGZhemVjbGFuKSkNCg0KdG9wX3RlYW1fZWFybmluZ3NfaW1hZ2VzIDwtIHRvcF90ZWFtX2Vhcm5pbmdzICU+JSANCiAgbXV0YXRlKHRvcF90ZWFtX2ltYWdlcykNCg0KdG9wX3RlYW1fZWFybmluZ3NfaW1hZ2VzICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gVG90YWxVU0RQcml6ZS8xMDAwMDAwLA0KICAgICAgICAgICAgICAgeSA9IGZjdF9yZW9yZGVyKFRlYW1OYW1lLCBUb3RhbFVTRFByaXplKSwNCiAgICAgICAgICAgICBmaWxsID0gVG90YWxVU0RQcml6ZSkpKw0KICBnZW9tX2NvbCgpKw0KICBnZW9tX2ltYWdlKGFlcyhpbWFnZSA9IGltYWdlKSwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuMDUpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIHNjYWxlX3hfY29udGludW91cygpKw0KICBsYWJzKHRpdGxlID0gIlRvdGFsIFRvdXJuYW1lbnQgRWFybmluZ3MgYnkgVGVhbSIsDQogICAgICAgc3VidGl0bGUgPSAiKE1pbGxpb25zIG9mIFVTIERvbGxhcnMpIiwNCiAgICAgICB4ID0gIiIsDQogICAgICAgeSA9ICIiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIEVzcG9ydHNFYXJuaW5ncy5jb20sIENyZWF0ZWQgYnkgQ2hhcmxpZSBUcmFuIikNCmBgYA0KDQpUaGUgYmFyZ3JhcGggYWJvdmUgc2hvd3MgdGhlIHRvcCBFc3BvcnRzIG9yZ2FuemF0aW9ucy90ZWFtcyBhcm91bmQgdGhlIHdvcmxkIHdpdGggdGVhbXMgdGhhdCBoYXZlIGNvbnRyYWN0ZWQgcHJvZmVzc2lvbmFsIHBsYXllcnMgd2hvIGNvbXBldGVkIGluIHByb2Zlc3Npb25hbCBtYXRjaGVzIGFuZCBlYXJuIHRoZSB0b3VybmFtZW50cyBwcml6ZXMuIE9uZSBvZiB0aGUgZ2FtZXMgdGhhdCBwcm92aWRlIG9uZSB0aGUgbGFyZ2VzdCBwZXJjZW50IG9mIHRoZSBvcmdhbml6YXRpb24ncyB0b3RhbCBlYXJuaW5ncyBpcyBMZWFndWUgb2YgTGVnZW5kcy4NCg0KYGBge3IgZWNobz1GQUxTRX0NCmxvbF92c190b3RhbF9lYXJuaW5ncyA8LSBsb2xfdG91cm5hbWVudF9lYXJuaW5ncyAlPiUgDQogIGZpbHRlcihUZWFtTmFtZSAlaW4lIGMoIlRlYW0gTGlxdWlkIiwgIk9HIiwgIkV2aWwgR2VuaXVzZXMiLCAiRm5hdGljIiwgIlZpcnR1cy5wcm8iLCAiTmV3YmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlZpY2kgR2FtaW5nIiwgIlRlYW0gU2VjcmV0IiwgIkludmljdHVzIEdhbWluZyIsICJOYXR1cyBWaW5jZXJlIiwgIkxHRCBHYW1pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAiQ2xvdWQ5IiwgIlNLIFRlbGVjb20gVDEiLCAiV2luZ3MgR2FtaW5nIiwgIlBhcmlzIFNhaW50LUdlcm1haW4gRXNwb3J0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiRmF6ZSBDbGFuIikpICU+JSANCiAgbGVmdF9qb2luKHRvcF90ZWFtX2Vhcm5pbmdzLA0KICAgICAgICAgICAgYnkgPSAiVGVhbU5hbWUiKSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIlRlYW1JZCIpKSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIlRvdGFsVG91ciIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIlRvdGFsVVNEUHJpemUiKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwcml6ZV9lYXJuaW5ncyIpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gaWZlbHNlKHZhcmlhYmxlID09ICJUb3RhbFVTRFByaXplLngiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCBQcml6ZWQgRWFybmVkIFxuKExlYWd1ZSBvZiBMZWdlbmRzKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwgUHJpemUgRWFybmVkIikpDQoNCnBlcmNlbnRhZ2VfbG9sX2Vhcm5pbmdzIDwtIGxvbF90b3VybmFtZW50X2Vhcm5pbmdzICU+JSANCiAgZmlsdGVyKFRlYW1OYW1lICVpbiUgYygiVGVhbSBMaXF1aWQiLCAiT0ciLCAiRXZpbCBHZW5pdXNlcyIsICJGbmF0aWMiLCAiVmlydHVzLnBybyIsICJOZXdiZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAiVmljaSBHYW1pbmciLCAiVGVhbSBTZWNyZXQiLCAiSW52aWN0dXMgR2FtaW5nIiwgIk5hdHVzIFZpbmNlcmUiLCAiTEdEIEdhbWluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICJDbG91ZDkiLCAiU0sgVGVsZWNvbSBUMSIsICJXaW5ncyBHYW1pbmciLCAiUGFyaXMgU2FpbnQtR2VybWFpbiBFc3BvcnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJGYXplIENsYW4iKSkgJT4lIA0KICBsZWZ0X2pvaW4odG9wX3RlYW1fZWFybmluZ3MsDQogICAgICAgICAgICBieSA9ICJUZWFtTmFtZSIpICU+JSANCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiVGVhbUlkIikpICU+JSANCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiVG90YWxUb3VyIikpICU+JSANCiAgbXV0YXRlKHByb3BvcnRpb24gPSBUb3RhbFVTRFByaXplLngvVG90YWxVU0RQcml6ZS55KQ0KIA0KDQpncmFwaDMgPC0gbG9sX3ZzX3RvdGFsX2Vhcm5pbmdzICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fY29sKGFlcyh4ID0gcHJpemVfZWFybmluZ3MvMTAwMDAwMCwNCiAgICAgICAgICAgICAgIHkgPSBmY3RfcmVvcmRlcihUZWFtTmFtZSwgcHJpemVfZWFybmluZ3MpKSkgKw0KICBmYWNldF9ncmlkKHZhcnModmFyaWFibGUpKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHggPSAiTWlsbGlvbnMgb2YgVVMgRG9sbGFycyIsDQogICAgICAgeSA9ICIiKQ0KDQpncmFwaDQgPC0gcGVyY2VudGFnZV9sb2xfZWFybmluZ3MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVvcmRlcihUZWFtTmFtZSwgcHJvcG9ydGlvbiksDQogICAgICAgICAgICAgeSA9IHByb3BvcnRpb24pKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgUHJpemUgRWFybmVkIGZyb20gXG5MZWFndWUgb2YgTGVnZW5kcyIsDQogICAgICAgeCA9ICIiLCANCiAgICAgICB5ID0gIiIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkNCg0KZ3JhcGg0ICsgZ3JhcGgzICsgbGFicyhjYXB0aW9uID0gIkRhdGEgZnJvbSBFc3BvcnRzRWFybmluZ3MuY29tLCBDcmVhdGVkIGJ5IENoYXJsaWUgVHJhbiIpDQpgYGANCg0KT2YgdGhlIHRvcCBmb3VyIEVzcG9ydHMgdGVhbXMgdGhhdCBoYXZlIGVhcm5lZCB0aGUgbWFqb3JpdHkgb2YgdGhlaXIgcHJpemUgZnJvbSBwcm9mZXNzaW9uYWwgdG91cm5hbWVudHMgZnJvbSBMZWFndWUgb2YgTGVnZW5kcywgdGhlIHRocmVlIHRlYW1zLCBTSyBUZWxlY29tIFQxLCBJbnZpY3R1cyBHYW1pbmcsIGFuZCBGbmF0aWMsIGhhdmUgYWxsIHdvbiB0aGUgaW50ZXJuYXRpb25hbCBMZWFndWUgb2YgTGVnZW5kcyBXb3JsZHMgdG91cm5hbWVudC4gTGVhZ3VlIG9mIGxlZ2VuZHMgaGF2ZSBpbXBhY3RlZCB0aGUgbWFzc2l2ZSBncm93dGggb2YgdGhlIGxhcmdlc3QgRXNwb3J0cyB0ZWFtcyBpbiB0aGUgd29ybGQuDQoNCiMjIFdoYXQgaXMgTGVhZ3VlIG9mIExlZ2VuZHM/DQoNCiFbTWFwIG9mIExlYWd1ZSBvZiBMZWdlbmRzIC0gU3VtbW9uZXIncyBSaWZ0XShTdW1tb25lcidzX1JpZnRfVXBkYXRlX01hcC5wbmcpDQoNCg0KQnV0IGJlZm9yZSB3ZSBjYW4gZGlzY3VzcyB0aGUgaW1wYWN0IG9mIExlYWd1ZSBvZiBMZWdlbmRzLCBpdCBpcyBnb29kIHRvIGtub3cgd2hhdCB0aGUgcHJhaXNlIGFuZCBsYXJnZSBmb2xsb3dpbmcgb2YgdGhlIGdhbWUgaXMgYWJvdXQuIENyZWF0ZWQgaW4gMjAwOSwgTGVhZ3VlIGxlZ2VuZHMgaXMgYSB0ZWFtIG11bHRpcGxheWVyIG9ubGluZSBiYXR0bGUgYXJlbmEgd2hlcmUgdGhlIHR3byB0ZWFtcyBtYWRlIG9mIDUgcGxheWVycyB3aGVyZSB0aGUgZ29hbCBpcyB0byBkZWZlYXQgdGhlIGVuZW1pZXMnICJuZXh1cyIgb3IgdGhlaXIgYmFzZSBsb2NhdGVkIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBtYXAuIFRoZSBtYXAsIGNhbGxlZCAiU3VtbW9uZXIncyBSaWZ0LCBpcyBzcGxpdCBieSB0aHJlZSBsYW5lcyBsaW5lZCB3aXRoIHRocmVlIHR1cnJldHMgaW4gZWFjaCBsYW5lIGFuZCB0d28gbW9yZSB0dXJyZXRzIHByb3RlY3RpbmcgdGhlIG5leHVzIGZvciBlYWNoIHNpZGUgb2YgdGhlIG1hcC4gSW4gYmV0d2VlbiBlYWNoIGxhbmUgaXMgYW4gYXJlYSBrbm93biBhcyB0aGUganVuZ2xlIHdoZXJlIGp1bmdsZSBtb25zdGVycyAocmFwdG9ycywga3J1Z3MsIHdvbHZlcywgZ3JvbXAsIGdvbGVtLCBibHVlIHNlbnRpbmVsLCBhbmQgcmVkIGJyYW1ibGViYWNrKXJlc2lkZS4gVGhlcmUgaXMgYWxzbyBhIHJpdmVyIHRoYXQgcnVucyBhY3Jvc3MgdGhlIG1hcCB3aXRoIHBpdHMgaG9tZSB0byB0aGUgUmlmdCBIZXJhbGQsIEJhcm9uIE5hc2hvciwgYW5kIEVsZW1lbnRhbCBEcmFnb25zLiANCg0KRWFjaCB0ZWFtIGNob29zZXMgYSBjaGFtcGlvbiB0aGF0IHNwYXduIG9uIHRoZSBtYXAgdGhhdCBoYXZlIHdpdGggYW4gYXNzaWduZWQgcm9sZTogdG9wIGxhbmUsIG1pZCBsYW5lLCBib3QgbGFuZSwgc3VwcG9ydCAoYWxzbyBpbiB0aGUgYm90IGxhbmUpLCBhbmQganVuZ2xlci4gQmFzZWQgb2YgdGhlIG5hbWUgb2YgdGhlaXIgcm9sZXMsIHRoZXkgd2lsbCBwbGF5IHRoZSBnYW1lIGluIHRob3NlIHJlcGVjdGl2ZSBsb2NhdGlvbnMuIFdoZW4gdGhlIGdhbWUgc3RhcnRzLCB0aGUgbGFuZSBwbGF5ZXJzIChhbHNvIGNhbGxlZCBsYW5lcnMpIG1lZXQgZWFjaCBvdGhlciBpbiB0aGVpciBsYW5lIHdpdGggYSBzbWFsbCBncm91cCBvZiBtaW5pb25zIHRoYXQgY29udGlub3VzbHkgcmVzcGF3biBhbmQgd2FsayBmcm9tIHRoZSBuZXh1cyBkb3duIHRoZWlyIHJlcGVjdGl2ZSBsYW5lcywgd2hpbGUgdGhlIGp1bmdsZXIgdHJhdmVyc2VzIHRocm91Z2ggdGhlIGp1bmdsZS4gSW4gZWFjaCBsYW5lLCB0aGUgbGFuZXJzIGdvYWwgaXMgdG8ga2lsbCB0aGUgbWluaW9ucyBmb3IgZWFybmluZyBpbiBnYW1lIGdvbGQgYW5kIGFsc28gYXR0ZW1wdCB0byBraWxsIHRoZSBvcHBvc2luZyBlbmVteSBsYW5lciB3aGljaCBhbHNvIGdyYW50cyB0aGVtIGEgc2lnbmlmaWNhbnQgYW1vdW50IG1vcmUgZ29sZC4gVGhlIGp1bmdsZXJzIGFsc28gZWFybiBpbiBnYW1lIGdvbGQgYnkga2lsbGluZyB0aGUganVuZ2xlciBtb25zdGVycyBvciB2aXNpdGluZyBhIGxhbmUgdG8ga2lsbCB0aGUgZW5lbXkuIFRoaXMgcHJvY2VzcyBvZiBraWxsaW5nIG1pbmlvbnMsIG1vbnN0ZXJzLCBhbmQgZW5lbXkgcGxheWVycyBnb2VzIG9uIGFzIGVhY2ggcGxheWVyIGFjY3VtdWxhdGVzIGdvbGQgaW4gb3JkZXIgdG8gcHVyY2hhc2Ugc3BlY2lhbGl6ZWQgaXRlbXMgdG8gaW5jcmVhc2UgdGhlIHN0cmVuZ3RoIGFuZCBoZWFsdGggb2YgZWFjaCBwbGF5ZXIncyBjaGFtcGlvbi4gVGhlIHN0cm9uZ2VyIHRoZSBjaGFtcGlvbiBiZWNvbWVzIHRoZSBoaWdoZXIgdGhlIGNoYW5jZSB0aGUgdGVhbSBjYW4ga2lsbCB0aGUgZW5lbWllcyBhbmQgcHVzaCB0b3dhcmRzIHRoZWlyIGJhc2UgdG8gZGVzdHJveSB0aGUgbmV4dXMgYW5kIHdpbiB0aGUgbWF0Y2guDQoNClRoZSBiZWNvbWVzIG11Y2ggbW9yZSBjb21wbGljYXRlZCB3aGVuIHByb2Zlc3Npb25hbCBwbGF5ZXJzIGFuZCB0ZWFtcyBjb25zaWRlciB0aGUgc21hbGxlc3QgZGV0YWlscywgc3RhdHMsIGFuZCBhY3Rpb25zLiBBIHNtYWxsIG1pc3Rha2UgYnkgYnV5aW5nIHRoZSB3cm9uZyBpbiBnYW1lIGl0ZW0gb3Igd2Fsa2luZyB0byB0aGUgd3JvbmcgYXJlYSBhbmQgZ2V0dGluZyBhbWJ1c2hlZCBieSB0aGUgZW5lbXkgY2FuIHR1cm4gdGhlIGdhbWUgYXJvdW5kIHRvd2FyZHMgdGhlIHRlYW0gdGhhdCB3b3VsZCBzZWVtIHRvIGJlIGxvc2luZy4gQnV0IHdoYXQgc3RhdGlzdGljcyB3aWxsIG1ham9ybHkgZGV0ZXJtaW5lcyB0aGUgbGlrZWxpaG9vZCB0aGUgdGVhbSB3aWxsIHdpbj8NCg0KYGBge3IgZWNobz1GQUxTRX0NCmxvbF9ibHVlX3NpZGUgPC0gaGlnaF9kaWFtb25kX3JhbmtlZF8xMG1pbiAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoInJlZCIpKQ0KDQpsb2xfcmVkX3NpZGUgPC0gaGlnaF9kaWFtb25kX3JhbmtlZF8xMG1pbiAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoImJsdWUiKSkNCg0KYmx1ZUdvbGREaWZmIDwtIGhpZ2hfZGlhbW9uZF9yYW5rZWRfMTBtaW4gJT4lIA0KICBhcnJhbmdlKGJsdWVHb2xkRGlmZikgJT4lICAgICAgICAgICAgIA0KICBmaWx0ZXIoYmx1ZUdvbGREaWZmID4gMCkgJT4lIA0KICBzdW1tYXJpc2UoYmx1ZXdpbnJhdGUgPSBzdW0ob25laXNibHVlV2lucykvbigpKjEwMCkNCg0KcmVkR29sZERpZmYgPC0gaGlnaF9kaWFtb25kX3JhbmtlZF8xMG1pbiAlPiUgDQogIGFycmFuZ2UocmVkR29sZERpZmYpICU+JSANCiAgZmlsdGVyKHJlZEdvbGREaWZmID4gMCkgJT4lIA0KICBzdW1tYXJpc2UocmVkd2lucmF0ZSA9ICgxLXN1bShvbmVpc2JsdWVXaW5zKS9uKCkpKjEwMCkNCg0KYmFyZ3JhcGhfZ29sZERpZmYgPC0gdGliYmxlKHNpZGUgPSBjKCJCbHVlIiwiQmx1ZSIsICJSZWQiLCAiUmVkIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzd2luID0gYygid2luIiwgImxvc2UiLCAid2luIiwgImxvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5yYXRlID0gYXMubnVtZXJpYyhjKGJsdWVHb2xkRGlmZiwgMTAwLWJsdWVHb2xkRGlmZiwgcmVkR29sZERpZmYsIDEwMC1yZWRHb2xkRGlmZikpKQ0KDQoNCnNvbG9xX2dvbGRkaWZmIDwtIGdncGxvdChiYXJncmFwaF9nb2xkRGlmZiwgYWVzKHggPSBzaWRlLCB5ID0gd2lucmF0ZSwgZmlsbCA9IGlzd2luKSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICdkb2RnZScpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTG9zZSIsICJXaW4iKSkrDQogIGxhYnModGl0bGUgPSAgIk5vbi1Qcm9mZXNzaW9uYWwgR2FtZXMgXG53aXRoIGEgUG9zaXRpdmUgR29sZCBEaWZmZXJlbmNlIiwNCiAgICAgICB4ID0gIiIsIA0KICAgICAgIHkgPSAiUGVyY2VudCBXaW5yYXRlIikNCg0Kc29sb3FfZ29sZGRpZmYNCmBgYA0KDQpCZWZvcmUgSSBjYW4gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIEkgd2lsbCBleHBsYWluIHdoYXQgdGhlIGRhdGEgaXMgY29sbGVjdGVkIG9uLiBJbiBtdWx0aXBsYXllciBMZWFndWUgb2YgTGVnZW5kcywgdGhlcmUgYXJlIHR3byBtYWluIGdhbWVtb2RlcyBvbiBTb21tb25lcidzIFJpZnQ6IE5vcm1hbCBhbmQgUmFua2VkLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZ2FtZW1vZGVzIGlzIFJhbmtlZCBnaXZlcyB0aGUgcGxheWVycyBhIHRpZXIgZnJvbSBJcm9uIHRvIENoYWxsZW5nZXIgd2hlcmUgdGhlIHBsYXllcnMgY2FuIGNsaW1kIHRoZSB0aWVyIGxhZGRlciBieSBlYXJuaW5nICJMUCIgcG9pbnRzLiBhbm90aGVyIHRoaW5nIHRvIG5vdGUgaXMgd2hlbiBhIHBsYXllciBxdWVuZXMgdXAgZm9yIGEgZ2FtZSBtYXRjaCBvbiB0aGUgU3VtbW9uZXIncyBSaWZ0IG1hcCB0aGV5IHdpbGwgc3Bhd24gb24gdGhlIHJpZ2h0IHNpZGUgbmV4dXMgb2YgdGhlIGxlZnQgc2lkZSBuZXh1cyB3aGVyZSByaWdodCBpcyBibHVlIHNpZGUgYW5kIGxlZnQgaXMgcmVkIHNpZGUuDQoNClRoZSBncmFwaCBhYm92ZSBzaG93cyB0aGUgZGF0YSBjb2xsZWN0ZWQgZnJvbSBvdmVyIDksODAwIERpYW1vbmQgcmFua2VkIGdhbWVzIGZyb20gdGhlIFdlc3Rlcm4gRXVyb3BlYW4gc2VydmVyLiBUaGUgZm9jdXMgb2YgdGhpcyBzcGVjaWZpYyBhbmFseXNpcyBmb3IgTGVhZ3VlIG9mIExlZ2VuZHMgc2hvd3MgdGhhdCBhbW9uZyB0aGUgbWFueSB2YXJpYWJsZXMgaW5zaWRlIHRoZSBnYW1lIG92ZXIgNzAlIG9mIHRoZSBnYW1lcyBhIHRlYW0gd2lucyBieSBub24gcHJvZmVzc2lvbmFsIHBsYXllcnMgYXJlIGdyZWF0bHkgaW1wYWN0ZWQgYnkgdGhlIHBvc2l0aXZlIGdvbGQgZGlmZmVyZW5jZSByZWxhdGl2ZSB0byB0aGUgb3Bwb3NpbmcgdGVhbSB3aGVyZSB0aGUgZ29sZCBpcyBlYXJuZWQgYnkgZmFybWluZyBtaW5pb25zIGFuZCBqdW5nbGUgbW9uc3RlcnMsIGtpbGxpbmcgdGhlIGVuZW15LCBhbmQgYWNjb21wbGlzaGluZyB0aGUgb2JqZWN0aXZlcyB0aGF0IGdpdmUgZ29sZC4NCg0KIVtSYW5rcyBmcm9tIGxlZnQgdG8gcmlnaHQ6IElyb24sIEJyb256ZSwgU2lsdmVyLCBHb2xkLCBQbGF0aW51bSwgRGlhbW9uZCwgTWFzdGVyLCBHcmFuZG1hc3RlciwgQ2hhbGxlbmdlcl0obG9sX2VtYmxlbXNfYW5kX3Bvc2l0aW9ucy5wbmcpDQoNCk90aGVyIGZhY3RvcnMgdGhhdCBsZWFkIHRvIHRoZSByZXN1bHQgb2YgdGhlIGdhbWUgdGhhdCBhcmUgbGVzcyByZWxhdGVkIChhbHRob3VnaCBwYXJpdGFsbHkgaW52b2x2ZSBnb2xkIGdhbWUgZm9yIHRoZSBwbGF5ZXJzKSBhcmUgb2JqZWN0aXZlcy4gSW4gdGhlIGdhbWUgb24gU3VtbW9uZXIncyBSaWZ0IHRoZXJlIGFyZSBjZXJ0YWluIG9iamVjdGl2ZXMgdG8gaGVscCB0aGUgdGVhbSBwdWxsIGFoZWFkIHRvIHJlYWNoIHRoZSBmaW5hbCBnb2FsIG9mIGRlc3Ryb3lpbmcgdGhlIG5leHVzLg0KVGhlIGZvbGxvd2luZyBpcyBhIGdlbmVyYWwgbGlzdCBvZiBvYmplY3RpdmVzIHRoYXQgdGhlIHRlYW0gY2FuIGFjaGlldmUgbG9jYXRlZCBpbiB0aGUgcGl0cyBhcm91bmQgdGhlIHJpdmVyIG9mIHRoZSBtYXA6DQotIFJpZnQgSGVyYWxkOiBraWxsaW5nIHRoaXMgY3JlYXR1cmUgZ2l2ZXMgdGhlIHBsYXllciBhIGRyb3AgdGhhdCBjYW4gYmUgc3Bhd25lZCB0byBhY3QgYXMgYSBiYXR0ZXJpbmcgcmFtIGFnYWluc3QgdHVycmVudHMgYW5kIG90aGVyIGVuZW15IHN0cnVjdHVyZXMgdGhhdCB3aWxsIGdyYW50IGdvbGQgdG8gdGhlIHBsYXllcnMNCi0gRWxlbWVudGFsIERyYWdvbnM6IFRoZXJlIGFyZSBmb3VyIGVsZW1lbnRhbCBkcmFnb25zIHRoYXQgdGhlIHBsYXllcnMgY2FuIGtpbGwgdGhhdCB3aWxsIGdyYW50IHRoZSBlbnRpcmUgdGVhbSBhIGJ1ZmYgaW4gY3JlYXNlZCBpbiBhIGNlcnRhaW4gc3RhdCBiYXNlZCBvbiB3aGNpaCBkcmFnb24gaXMgc2xhaW4NCi0gQmFyb24gTmFzaG9yOiBBIGdpYW50IHNlcnBlbnQtbGlrZSBjcmVhdHVyZSB0aGF0IHdoZW4ga2lsbGVkIGdyYW50cyB0aGUgdGhlIHBsYXllciAzMDAgZ29sZCBvbiB0aGUgdGVhbS4gQWxzbyBnaXZlcyB0aGVtIHBvd2VyIG9mIHN0cmVuZ3RoZW4gdGhlIGFsbHkgbWluaW9ucyB3aGVuIHRoZSBwYXllciBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIG1pbmlvbnMuDQotIEVsZGVyIERyYWdvbjoga2lsbGluZyB0aGUgRWxkZXIgZHJhZ29uIGdyYW50cyB0aGUgdGVhbSAyNTAgZ29sZCBhbmQgc3Ryb25nZXN0IGluZGl2aWR1YWwgYnVmZiB0byBlYWNoIHBsYXllciB0aGF0IGxhc3RzIGZvciBhIHNob3J0IHRpbWUuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmxvbF9vYmplY3RpdmVzX2xlYWRfdG93aW4gPC0gaGlnaF9kaWFtb25kX3JhbmtlZF8xMG1pbiAlPiUgDQogIHNlbGVjdChlbmRzX3dpdGgoYygiZ2FtZUlkIiwgImJsdWVXaW5zIiwgIlRvd2Vyc0Rlc3Ryb3llZCIsICJEcmFnb25zIiwgIkhlcmFsZHMiLCAiRWxpdGVNb25zdGVycyIpKSkgDQoNCmxvbF9vYmplY3RpdmVzX2xlYWRfdG93aW4gPC0gbG9sX29iamVjdGl2ZXNfbGVhZF90b3dpbiAlPiUgDQogIG11dGF0ZShvYmplY3RpdmVfc2NvcmVfYmx1ZSA9IHJvd1N1bXMobG9sX29iamVjdGl2ZXNfbGVhZF90b3dpblssIGMoMiw0LDYsOCldKSkgJT4lIA0KICBtdXRhdGUob2JqZWN0aXZlX3Njb3JlX3JlZCA9IHJvd1N1bXMobG9sX29iamVjdGl2ZXNfbGVhZF90b3dpblssIGMoMyw1LDcsOSldKSkgJT4lIA0KICBtdXRhdGUob2Jqc2NvcmVfY29tcGFyZSA9IGlmZWxzZSgob2JqZWN0aXZlX3Njb3JlX2JsdWUgPiBvYmplY3RpdmVfc2NvcmVfcmVkKSAmIG9uZWlzYmx1ZVdpbnMgPT0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKChvYmplY3RpdmVfc2NvcmVfYmx1ZSA8IG9iamVjdGl2ZV9zY29yZV9yZWQpICYgb25laXNibHVlV2lucyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uob2JqZWN0aXZlX3Njb3JlX2JsdWUgPT0gb2JqZWN0aXZlX3Njb3JlX3JlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIikpKSkNCg0KIyBsb2xfb2JqZWN0aXZlc19sZWFkX3Rvd2luX3RhYmxlIDwtIGxvbF9vYmplY3RpdmVzX2xlYWRfdG93aW4gJT4lIA0KIyAgIG11dGF0ZShvbmVpc2JsdWVXaW5zID0gaWZlbHNlKG9uZWlzYmx1ZVdpbnMgPT0gMCwgIkxvc3MiLCAiV29uIikpICU+JSANCiMgICBzZWxlY3Qob25laXNibHVlV2lucywgb2JqZWN0aXZlX3Njb3JlX2JsdWUsIG9iamVjdGl2ZV9zY29yZV9yZWQsIG9ianNjb3JlX2NvbXBhcmUpIA0KIyANCiMgY29sbmFtZXMobG9sX29iamVjdGl2ZXNfbGVhZF90b3dpbl90YWJsZSlbMV0gPC0gIkJsdWUgVGVhbSBSZXN1bHQiDQojIGNvbG5hbWVzKGxvbF9vYmplY3RpdmVzX2xlYWRfdG93aW5fdGFibGUpWzJdIDwtICJCbHVlIFRlYW0gT2JqZWN0aXZlIFNjb3JlIg0KIyBjb2xuYW1lcyhsb2xfb2JqZWN0aXZlc19sZWFkX3Rvd2luX3RhYmxlKVszXSA8LSAiUmVkIFRlYW0gT2JqZWN0aXZlIFNjb3JlIg0KIyBjb2xuYW1lcyhsb2xfb2JqZWN0aXZlc19sZWFkX3Rvd2luX3RhYmxlKVs0XSA8LSAiUHJlZGljdGlvbiINCg0KICANCnNvbG9xX29ianNjb3JlIDwtIGdncGxvdChsb2xfb2JqZWN0aXZlc19sZWFkX3Rvd2luLCBhZXMoeCA9IG9ianNjb3JlX2NvbXBhcmUpKSsNCiAgZ2VvbV9iYXIoKSsNCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uIG9mIERpYW1vbmQgR2FtZXMgXG5HaXZlbiBPYmplY3RpdmUgU2NvcmUiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBHYW1lcyIpKw0KICB0aGVtZV9taW5pbWFsKCkNCg0Kc29sb3Ffb2Jqc2NvcmUNCmBgYA0KDQpGb3IgZWFjaCBvYmplY3RpdmUgdGhhdCB0aGUgdGVhbSBhY2hpZXZlcyBmcm9tIHRoZSBsaXN0IGFib3ZlIHdpdGhpbiBhIG1hdGNoLCBvbmUgb2JqZWN0aXZlIHBvaW50IGlzIGdpdmVuIHRvIHRoZSBibHVlL3JlZCB0ZWFtLiBUaGUgZ3JhcGggYWJvdmUgc2hvd3MgaG93IGNvbXBsZXRpbmcgb2JqZWN0aXZlcyBjYW4gcmVzdWx0IGluIGEgd2luLiBNYXRjaGVzIGxhYmVsZWQgIkV4cGVjdGVkIiBtZWFucyBhIHRlYW0ncyBvYmplY3RpdmUgc2NvcmUgaXMgaGlnaGVyIHRoYW4gdGhlIG90aGVyIHRlYW0gYW5kIHRoZSBmaW5hbCByZXN1bHQgaXMgdGhlIHRlYW0gd2l0aCB0aGUgaGlnaGVyIHNjb3JlIHdvbi4gTWF0Y2hlcyBsYWJlbGVkICJVbmRlZmluZWQiIG1lYW5zIHRoZSBvYmplY3RpdmUgc2NvcmUgZm9yIGJvdGggdGVhbXMgYXJlIGVxdWFsIHNvIHRoZSByZXN1bHQgb2YgdGhlIG1hdGNoIGRlcGVuZHMgb24gb3RoZXIgZmFjdG9ycy4gTWF0Y2hlcyBsYWJlbGVkICJVbmV4cGVjdGVkIG1lYW5zIGEgdGVhbSdzIG9iamVjdGl2ZSBzY29yZSBpcyBsb3dlciB0aGFuIHRoZSBvdGhlciB0ZWFtIGFuZCB0aGUgZmluYWwgcmVzdWx0IGlzIHRoZSB0ZWFtIHdpdGggdGhlIGxvd2VyIHNjb3JlIHdvbi4gT3ZlciA2MCUgb2YgdGhlIG1hdGNoZXMgaW4gb3ZlciA5ODAwIERpYW1vbmQgcmFua2VkIGdhbWVzIHNob3cgdGhhdCBjb21wbGV0aW5nIG9iamVjdGl2ZXMNCg0KU28gd2hhdCBkb2VzIGFsbCB0aGlzIGRhdGEgbWVhbiBmb3IgdGhlIGF2ZXJhZ2UgTGVhZ3VlIG9mIGxlZ2VuZHM/DQpJbiBvcmRlciBmb3IgeW91IHRvIGhhdmUgdGhlIGJlc3QgY2hhbmNlIHBvc3NpYmxlIHRvIHdpbiB0aGUgZ2FtZSwgaXQgaXMgZXh0cmVtZWx5IGltcG9ydGFudCB0byBmYXJtIG1pbmlvbnMgYW5kIGtpbGwganVuZ2xlIG1vbnN0ZXJzIHRvIGhhdmUgdGhlIHNhZmVzdCBwYXRoIHRvd2FyZHMgZWFybmluZyB0aGUgbW9zdCBnb2xkIHdpdGhvdXQgZHlpbmcgYnkgdGhlIGVuZW15IGFuZCB3aW5uaW5nIGEgZ2FtZS4gDQoNCiMjIFByb2Zlc3Npb25hbCBMZWFndWUgb2YgTGVnZW5kcyBFc3BvcnRzDQoNCi10YWxrIGFib3V0IGhvdyBpIG9ubHkgc2VsZWN0ZWQgdGhlIHRvcCA0IHJlZ2lvbnMNCi11c2UgdGhlIGRhdGEgYW5kIGV4cGxhaW4gaXRzIG1lYW5pbmcNCi0gdXNlIHRoZSBoaWdoIGRpYW1vbmQgcmFua2VkIGdhbWVzIGRhdGEgDQotIHVzZSB0aGUgcHJvIG1hdGNoZXMgdG8gc2hvdyB0aGUgbGV2ZWwgYW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBkaWFtb25kIGFuZCBwcm8gcGxheWVyIGdhbWVzDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnByb19sb2xfcmV2aXNlZCA8LSBwcm9fbG9sX21hdGNoZXMgJT4lIA0KICBmaWx0ZXIobGVhZ3VlICVpbiUgYygiTFBMIiwgIkxDUyIsICJMQ0siLCAiTEVDIikpICU+JSANCiAgbXV0YXRlKHJlZHdpbiA9IGlmZWxzZShyZXN1bHQgPT0gMSwgMCwgMSkpDQoNCnByb19sb2xfd2lucyA8LSB0aWJibGUodGVhbSA9IGMocHJvX2xvbF9yZXZpc2VkJGJsdWV0ZWFtLCBwcm9fbG9sX3JldmlzZWQkcmVkdGVhbSksDQogICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGMocHJvX2xvbF9yZXZpc2VkJHJlc3VsdCwgcHJvX2xvbF9yZXZpc2VkJHJlZHdpbiksDQogICAgICAgICAgICAgICAgICAgICAgIGxlYWd1ZSA9IGMocHJvX2xvbF9yZXZpc2VkJGxlYWd1ZSwgcHJvX2xvbF9yZXZpc2VkJGxlYWd1ZSkpICU+JSANCiAgZ3JvdXBfYnkobGVhZ3VlLCB0ZWFtKSAlPiUgDQogIHN1bW1hcmlzZSh3aW5yYXRlID0gKHN1bShyZXN1bHQpL24oKSkqMTAwKSAlPiUgDQogIGFycmFuZ2UobGVhZ3VlLCBkZXNjKHdpbnJhdGUpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQpwcm9fbG9sX3dpbnMgJT4lIA0KICBncm91cF9ieShsZWFndWUpICU+JSANCiAgc2xpY2VfaGVhZChuID0gMykgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsZWFndWUsDQogICAgICAgICAgIHggPSB3aW5yYXRlLA0KICAgICAgICAgICBjb2xvciA9IHRlYW0pKSsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIA0KICAgICAgICAgICBwb3NpdGlvbiA9ICdkb2RnZScpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gdGVhbSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gMS4xKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlID0gIlRvcCBXaW5yYXRlcyBvZiBQcm9mZXNzaW9uYWwgTGVhZ3VlIG9mIExlZ2VuZHMgVGVhbXMiLA0KICAgICAgICAgICB4ID0gIlBlcmNlbnQgV2lucmF0ZSIsDQogICAgICAgICAgIHkgPSAiTGVhZ3VlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQogIA0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCnByb19pbmRlcHRoX3N0YXRzX2dvbGQgPC0gcHJvX2luZGVwdGhfc3RhdHMgJT4lIA0KICBtdXRhdGUodDF0b3RhbEdvbGQgPSByb3dTdW1zKHByb19pbmRlcHRoX3N0YXRzWywxNzoyMV0pKSAlPiUgDQogIG11dGF0ZSh0MnRvdGFsR29sZCA9IHJvd1N1bXMocHJvX2luZGVwdGhfc3RhdHNbLDIyOjI2XSkpICU+JSANCiAgbXV0YXRlKGdvbGREaWZmID0gdDF0b3RhbEdvbGQgLSB0MnRvdGFsR29sZCkgDQoNCnByb19pbmRlcHRoX3N0YXRzX2dvbGRibHVlIDwtIHByb19pbmRlcHRoX3N0YXRzX2dvbGQgJT4lIA0KICBmaWx0ZXIoZ29sZERpZmYgPiAwKSAlPiUgDQogIHN1bW1hcmlzZSh3aW5yYXRlID0gc3VtKHQxX3Jlc3VsdC9uKCkpKjEwMCkNCg0KcHJvX2luZGVwdGhfc3RhdHNfZ29sZHJlZCA8LSBwcm9faW5kZXB0aF9zdGF0c19nb2xkICU+JSANCiAgZmlsdGVyKGdvbGREaWZmIDwgMCkgJT4lIA0KICBzdW1tYXJpc2Uod2lucmF0ZSA9IHN1bSh0Ml9yZXN1bHQvbigpKSoxMDApDQoNCnByb19pbmRlcHRoX3N0YXRzX2dvbGR3aW5yYXRlIDwtIHRpYmJsZSh0ZWFtID0gYygiQmx1ZSIsICJCbHVlIiwgIlJlZCIsICJSZWQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgID0gYygid2luIiwgImxvc2UiLCAid2luIiwgImxvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5yYXRlID0gYXMubnVtZXJpYyhjKHByb19pbmRlcHRoX3N0YXRzX2dvbGRibHVlLCAxMDAtcHJvX2luZGVwdGhfc3RhdHNfZ29sZGJsdWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb19pbmRlcHRoX3N0YXRzX2dvbGRyZWQsIDEwMC1wcm9faW5kZXB0aF9zdGF0c19nb2xkcmVkKSkpDQoNCnByb19nb2xkZGlmZiA8LSBnZ3Bsb3QocHJvX2luZGVwdGhfc3RhdHNfZ29sZHdpbnJhdGUsIGFlcyh4ID0gdGVhbSwgeSA9IHdpbnJhdGUsIGZpbGwgPSByZXN1bHQpKSsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gJ2RvZGdlJykrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMb3NlIiwgIldpbiIpKSsNCiAgbGFicyh0aXRsZSA9ICJQcm9mZXNzaW9uYWwgR2FtZXMgXG53aXRoIGEgUG9zaXRpdmUgR29sZCBEaWZmZXJlbmNlIiwNCiAgICAgICB4ID0gIiIsDQogICAgICAgeSAgPSAiUGVyY2VudCBXaW5yYXRlcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCnNvbG9xX2dvbGRkaWZmICsgcHJvX2dvbGRkaWZmDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KcHJvX2luZGVwdGhfc3RhdHNfcmV2aXNlZCA8LSBwcm9faW5kZXB0aF9zdGF0cyAlPiUgDQogIHNlbGVjdChlbmRzX3dpdGgoYygiZHJhZ29ucyIsICJlbGRlcnMiLCAiaGVyYWxkcyIsICJiYXJvbnMiLCAidG93ZXJzIiwgImluaGliaXRvcnMiLCAidG90YWxnb2xkIiwgInJlc3VsdCIpKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLm51bWVyaWMpICU+JSANCiAgbmEub21pdCgpDQoNCnByb19vYmpzY29yZSA8LSBwcm9faW5kZXB0aF9zdGF0c19yZXZpc2VkICU+JSANCiAgbXV0YXRlKG9iamVjdGl2ZV9zY29yZV90MSA9IHJvd1N1bXMocHJvX2luZGVwdGhfc3RhdHNfcmV2aXNlZFssIGFzLm51bWVyaWMoYygxLDMsNSw3LDksMTMpKV0pKSAlPiUgDQogIG11dGF0ZShvYmplY3RpdmVfc2NvcmVfdDIgPSByb3dTdW1zKHByb19pbmRlcHRoX3N0YXRzX3JldmlzZWRbLCBhcy5udW1lcmljKGMoMiw0LDYsOCwxMSwxNCkpXSkpICU+JSANCiAgbXV0YXRlKG9ianNjb3JlX2NvbXBhcmUgPSBpZmVsc2UoKG9iamVjdGl2ZV9zY29yZV90MSA+IG9iamVjdGl2ZV9zY29yZV90MikgJiB0MV9yZXN1bHQgPT0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKChvYmplY3RpdmVfc2NvcmVfdDEgPCBvYmplY3RpdmVfc2NvcmVfdDIpICYgdDFfcmVzdWx0ID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShvYmplY3RpdmVfc2NvcmVfdDEgPT0gb2JqZWN0aXZlX3Njb3JlX3QyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZWZpbmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQiKSkpKQ0KDQpwcm9fb2Jqc2NvcmVfZ3JhcGggPC0gZ2dwbG90KHByb19vYmpzY29yZSwgYWVzKHggPSBvYmpzY29yZV9jb21wYXJlKSkrDQogIGdlb21fYmFyKCkrDQogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbiBvZiBQcm9mZXNzaW9uYWwgR2FtZXMgXG5HaXZlbiBPYmplY3RpdmUgU2NvcmUiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBHYW1lcyIpKw0KICB0aGVtZV9taW5pbWFsKCkNCg0Kc29sb3Ffb2Jqc2NvcmUgKyBwcm9fb2Jqc2NvcmVfZ3JhcGgNCmBgYA0KDQojIyBXaHkgaXMgdGhpcyBnYW1lIGltYXBjdGZ1bCB0byBFc3BvcnRzPw0KDQotIFRBTEsgQUJPVVQgVFdJVENIICAgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCg0KYGBg